package com.bxji.spring.eurekaclient;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.bxji.spring.ms.commons.domain.User;

/**
 * Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign,
 * 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验，开发者完全感知不到这是远程方法，更感知不到这是个HTTP请求，这整个调用过程和Dubbo的RPC非常类似。开发起来非常的优雅。<br/>
 * <hr/>
 * 
 * 为使用feign 调用目标服务编写接口 <br/>
 * feign 不支持 @GetMapping <br/>
 * 
 * @PathVariable 必须得设置 <br/>
 *               参数是复杂对象时，即使指定了是GET方法，feign依然会以POST方法进行发送请求
 * @author bxji
 *
 */
//Feign 配置
//@FeignClient("msec-provider-01") 

//基于Feign的融断
@FeignClient(name = "msec-provider-01", fallback = HystrixClientFallback.class)

//采用FallbackFactory 实现熔断, 个人感觉代码堆砌一起不够好
//@FeignClient(name = "msec-provider-01", fallbackFactory = HystrixClientFactory.class) 
public interface UserFeignClient {

    /**
     * RequestMapping RequestMethod 使用 SpringMvc的注解
     */
    @RequestMapping(value = "/findById/{id}", method = RequestMethod.GET)
    public User findById(@PathVariable("id") Long id);

    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public User postUser(@RequestBody User user);

}
